package com.wyr.admin.mq.listener;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 正常队列队列监听
 * <p>
 * 注意：本队列在集群部署时，消费时随机的
 *
 * @author wyr
 * @version 1.0
 * &#064;title QueueListener
 * &#064;description
 * &#064;date 2025/04/02 16:01
 */
@Slf4j
@Component
public class QueueListener {

    @RabbitListener(queues = "${zp.translate_topic}", ackMode = "MANUAL")
    public void processTranslate(String message, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) {
        try {
            log.info("翻译调用记录队列收到消息:{}", message);

            // 手动确认消息
            channel.basicAck(deliveryTag, false);
        } catch (Exception e) {
            log.error("处理日志消息异常:{}", e.getMessage(), e);
            try {
                // arg0：消息编号 递增的
                // arg1：true： 将一次性拒绝所有小于消息编号（deliveryTag）的消息
                //		false：仅拒绝传入的消息编号（deliveryTag）
                // arg2：true： 让消息重新回到队列
                // 		false：直接丢弃消息
                channel.basicNack(deliveryTag, false, false);
            } catch (IOException ioException) {
                log.error("消息拒绝失败: {}", ioException.getMessage(), ioException);
            }
        }
    }

    @RabbitListener(queues = "${zp.invoke_topic}", ackMode = "MANUAL")
    public void processInvoke(String message, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) {
        try {
            log.info("调用量队列收到消息:{}", message);

            // 手动确认消息
            channel.basicAck(deliveryTag, false);
        } catch (Exception e) {
            log.error("处理日志消息异常:{}", e.getMessage(), e);
            try {
                // arg0：消息编号 递增的
                // arg1：true： 将一次性拒绝所有小于消息编号（deliveryTag）的消息
                //		false：仅拒绝传入的消息编号（deliveryTag）
                // arg2：true： 让消息重新回到队列
                // 		false：直接丢弃消息
                channel.basicNack(deliveryTag, false, false);
            } catch (IOException ioException) {
                log.error("消息拒绝失败: {}", ioException.getMessage(), ioException);
            }
        }
    }
}
